package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

import com.sisgesbyte.common.ConstProyeccion;
import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaCliente;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteBean;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteListaRes;
import com.sisgesbyte.services.administracion.bean.ZonaBean;
import com.sisgesbyte.services.commonBean.GenericResponse;
import com.sisgesbyte.services.proyeccion.MantProyeccionFfvvService;
import com.sisgesbyte.services.proyeccion.MantProyeccionPeriodoService;
import com.sisgesbyte.services.proyeccion.bean.FiltroOpcionesFFVVBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyProductosPeriodoResponse;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvBean;
import com.sisgesbyte.services.proyeccion.bean.ListaProyeccionFfvvResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyProductoPeriodoBean;
import com.sisgesbyte.services.ventas.MantEstructuraVentaService;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.MantenimientoZona;
import com.sisgesbyte.services.ventas.bean.EstructuraVentaFO;
import com.sisgesbyte.services.ventas.bean.EstruturaVentaBean;
import com.sisgesbyte.services.ventas.bean.ListaEstructuraVentaResponse;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;
import com.sisgesbyte.services.ventas.bean.ZonaListaResponse;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class ResumenProyFfvvMBean extends MantenimientoAbstract implements
		Serializable {

	private static final long serialVersionUID = 1L;

	@EJB
	private MantProyeccionFfvvService mantProyeccionFfvvService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@EJB
	private MantEstructuraVentaService mantEstructuraVentaService;
	@EJB
	private MantenimientoZona mantenimientoZona;
	@EJB
	private MantProyeccionPeriodoService mantProyeccionPeriodoService;
	@EJB
	private MantenimientoCategoriaCliente mantenimientoCategoriaCliente;
	private List<EstruturaVentaBean> listaEstructuraVenta;
	private List<ListaProyeccionFfvvBean> listaProyeccionFfvv;
	private List<ListaProyeccionFfvvBean> selectedProyeccionFfvv;
	private List<CategoriaClienteBean> listaCategoriaCliente;
	private List<ZonaBean> listaZonas;
	private List<PeriodoBean> listaPeriodos;
	private int idZona;
	private int idCanal;
	private int periodoDefault;
	private int idEstructuraVenta;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private String tipoMantenimiento;
	private String saved;
	private String montoTotal;
	private String txtBuscar;
	private String colorProyeccionAsignado;
	@Inject
	private Validaciones validaciones;

	@PostConstruct
	private void init() {
		saved = "";
		tipoMantenimiento = "";
		txtBuscar = "";
		montoTotal="";
		cargarPeriodos();
		mostrarPeriodoDefault();
		cargarEstructuraVenta();
		cargarZonas();
		cargarCanales();
		inicializar();
	}
	
	@Override
	public void inicializar() {
		try{
			if(periodoDefault <1){
				System.out.println("Seleccionar periodo ");
				return;
			}
			BigDecimal totalPeriodo= BigDecimal.ZERO;
			if(idEstructuraVenta > 0 && idZona == 0 && idCanal == 0){
				ListaProyProductosPeriodoResponse proyPeriodo = mantProyeccionPeriodoService.listaProyeccionPeriodo(ObtenerIdTransaccion(), periodoDefault, "");
				if(proyPeriodo.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
					for(ProyProductoPeriodoBean proy : proyPeriodo.getListaProyeccionPeriodo()){
						totalPeriodo = totalPeriodo.add(proy.getCantidadProyectada().multiply(proy.getPrecioPromedio()));
					}
				}
			}
			
			BigDecimal totalM =  BigDecimal.ZERO;
			montoTotal="";
			FiltroOpcionesFFVVBean filtroOpciones = new FiltroOpcionesFFVVBean();
			filtroOpciones.setIdPeriodo(periodoDefault);
			filtroOpciones.setIdEstructuraId(idEstructuraVenta);
			filtroOpciones.setIdZona(idZona);
			filtroOpciones.setIdCanal(idCanal);
			filtroOpciones.setTxtBuscar(txtBuscar);
			ListaProyeccionFfvvResponse response = mantProyeccionFfvvService.mostrarListaProyeccionFfvv(ObtenerIdTransaccion(), filtroOpciones);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaProyeccionFfvv = response.getListaProyeccionFfvv();
				
				for(ListaProyeccionFfvvBean ls : listaProyeccionFfvv){
					totalM = totalM.add(ls.getMontoProyectado());
				}
				DecimalFormatSymbols simbolo=new DecimalFormatSymbols();
			    simbolo.setDecimalSeparator('.');
			    simbolo.setGroupingSeparator(',');
			    DecimalFormat formateador = new DecimalFormat("###,###.##",simbolo);
			    montoTotal = formateador.format(totalM.setScale(3, BigDecimal.ROUND_HALF_UP));
			    
				if(idEstructuraVenta > 0 && idZona == 0 && idCanal == 0){
				    System.out.println(totalM);
				    System.out.println(totalPeriodo);
				    
					int val = totalPeriodo.compareTo(totalM);
				    if( val == 0 ){
				    	colorProyeccionAsignado = ConstProyeccion.COLOR_VERDE;
				    }else if( val == 1 ){
				    	colorProyeccionAsignado = ConstProyeccion.COLOR_ROJO;
				    }
				    else if( val == -1 ){
				    	colorProyeccionAsignado = ConstProyeccion.COLOR_AMARILLO;
				    };
				    System.out.println(colorProyeccionAsignado);
				}else{
					colorProyeccionAsignado = "";
				}
			    
			}else{
				this.listaProyeccionFfvv = new ArrayList<ListaProyeccionFfvvBean>();
			}
			
		}catch(Exception e){
			System.out.println("Error al capturar la lista de FFVV " + e);
			this.listaProyeccionFfvv = new ArrayList<ListaProyeccionFfvvBean>();
		}
	}
	public void cargarPeriodos() {
		try {
			PeriodoListaBean periodos = mantenimientoPeriodo.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos = periodos.getListaPeriodos();
		} catch (Exception e) {
			System.out.println("Error al cargar los periodos: " + e);
		}
	}
	public void mostrarPeriodoDefault() {
		for (PeriodoBean ls : getListaPeriodos()) {
			if (ls.getDefecto() != null && ls.getDefecto() == true) {
				setPeriodoDefault(ls.getId());
			}
		}
	}
	
	public void cargarEstructuraVenta(){
		try{
			EstructuraVentaFO filtroOpciones = new EstructuraVentaFO();
			filtroOpciones.setActive(true);
			filtroOpciones.setTxtBuscar(null);
			ListaEstructuraVentaResponse response = mantEstructuraVentaService.mostrarEstructuraVenta(ObtenerIdTransaccion(), filtroOpciones);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaEstructuraVenta = response.getListaEstructuraVenta();
			}else{
				this.listaEstructuraVenta = new ArrayList<EstruturaVentaBean>();
			}
		}catch(Exception e){
			System.out.println("Error al listar Estructura de ventas " + e);
			this.listaEstructuraVenta = new ArrayList<EstruturaVentaBean>();
		}
	}
	public void cargarZonas(){
		try{
			 FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			ZonaListaResponse zonas = mantenimientoZona.listaZonas(ObtenerIdTransaccion(), filtro);
			if(zonas.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaZonas =zonas.getListaZonas();
			}
			
		}catch(Exception e){
			System.out.println("Error al obtener las zonas: " + e);
		}
	}
	public void cargarCanales(){
		try{
			 FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			 CategoriaClienteListaRes canales = mantenimientoCategoriaCliente.listaCategoriaCliente(ObtenerIdTransaccion(), filtro);
			if(canales.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaCategoriaCliente =canales.getListaCategoriaCliente();
			}else{
				this.listaCategoriaCliente =new ArrayList<CategoriaClienteBean>();
			}
			
		}catch(Exception e){
			System.out.println("Error al listar canales");
			this.listaCategoriaCliente =new ArrayList<CategoriaClienteBean>();
		}
	}
	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedProyeccionFfvv.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedProyeccionFfvv.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedProyeccionFfvv.size());
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		List<ListaProyeccionFfvvBean> selected = new ArrayList<ListaProyeccionFfvvBean>();
		selected.add((ListaProyeccionFfvvBean) event.getObject());
		setSelectedProyeccionFfvv(selected);
		setSaved("");
		opcionesControlador.habilitarControles(selectedProyeccionFfvv.size());
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);
	}

	@Override
	public void nuevoItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public void editItem() {
		setSaved("");
		setTipoMantenimiento(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE);	
	}

	@Override
	public void updateInsertItem() {
		if (tipoMantenimiento.equalsIgnoreCase(ConstantesInternasSistema.TIPO_MANTENIMIENTO_UPDATE)) {
			modificarItem();
		}
	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		
	}

	@Override
	public void modificarItem() {
		GenericResponse response = null;
		try {
			for (ListaProyeccionFfvvBean bean : listaSeleccionados(selectedProyeccionFfvv)) {
				response = mantProyeccionFfvvService.editarProyeccionFfvv(ObtenerIdTransaccion(), bean);
				if (response.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_OK);
					System.out.println("Se Acualizo correctamente");
				} else {
					setSaved(ConstantesInternasSistema.SAVED_ITEM_ERROR);
					System.out.println("Hubo un Error al Actualizar de BD " + response.getCodigoRespuesta() + " - " + response.getMensajeRespuesta());
				}
			}
			inicializar();
		} catch (Exception e) {
			System.out.println("Error en el proceso " + e);
		}
	}

	@Override
	public void eliminarItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public void actualizarEstado() {
		// TODO Auto-generated method stub

	}

	@Override
	public void limpiarFormulario() {
		List<ListaProyeccionFfvvBean> listaBean = new ArrayList<ListaProyeccionFfvvBean>();
		ListaProyeccionFfvvBean bean = new ListaProyeccionFfvvBean();
		bean.setCodigoBanda("");
		listaBean.add(bean);
		setSelectedProyeccionFfvv(listaBean);
	}

	@Override
	public void crearFiltro() {
		// TODO Auto-generated method stub

	}
	/*
	 * Metodo para recorrer y validar los tipos de campos seleccionados
	 */
	public List<ListaProyeccionFfvvBean> listaSeleccionados(List<ListaProyeccionFfvvBean> listaRequest) {
		List<ListaProyeccionFfvvBean> response = new ArrayList<ListaProyeccionFfvvBean>();
		for (ListaProyeccionFfvvBean listaBean : listaRequest) {
			ListaProyeccionFfvvBean bean = new ListaProyeccionFfvvBean();
				bean.setId(listaBean.getId());
				bean.setPeriodoId(listaBean.getPeriodoId());
				bean.setCodigoBanda(validaciones.validarCamposString(listaBean.getCodigoBanda()));
				bean.setDescripcion(validaciones.validarCamposString(listaBean.getDescripcion()));
				bean.setEmpleadoEstructuraId(listaBean.getEmpleadoEstructuraId());
				bean.setEstructuraVentaId(listaBean.getEstructuraVentaId());
				bean.setMontoProyectado(listaBean.getMontoProyectado());
				bean.setNombre(validaciones.validarCamposString(listaBean.getNombre()));
				bean.setPeriodoId(listaBean.getPeriodoId());
				
			response.add(bean);
		}
		return response;
	}
	public List<EstruturaVentaBean> getListaEstructuraVenta() {
		return listaEstructuraVenta;
	}

	public void setListaEstructuraVenta(
			List<EstruturaVentaBean> listaEstructuraVenta) {
		this.listaEstructuraVenta = listaEstructuraVenta;
	}

	public List<ListaProyeccionFfvvBean> getListaProyeccionFfvv() {
		return listaProyeccionFfvv;
	}

	public void setListaProyeccionFfvv(
			List<ListaProyeccionFfvvBean> listaProyeccionFfvv) {
		this.listaProyeccionFfvv = listaProyeccionFfvv;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public int getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(int periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public String getTipoMantenimiento() {
		return tipoMantenimiento;
	}

	public void setTipoMantenimiento(String tipoMantenimiento) {
		this.tipoMantenimiento = tipoMantenimiento;
	}

	public String getSaved() {
		return saved;
	}

	public void setSaved(String saved) {
		this.saved = saved;
	}

	public String getMontoTotal() {
		return montoTotal;
	}

	public void setMontoTotal(String montoTotal) {
		this.montoTotal = montoTotal;
	}

	public int getIdEstructuraVenta() {
		return idEstructuraVenta;
	}

	public void setIdEstructuraVenta(int idEstructuraVenta) {
		this.idEstructuraVenta = idEstructuraVenta;
	}

	public List<ListaProyeccionFfvvBean> getSelectedProyeccionFfvv() {
		return selectedProyeccionFfvv;
	}

	public void setSelectedProyeccionFfvv(
			List<ListaProyeccionFfvvBean> selectedProyeccionFfvv) {
		this.selectedProyeccionFfvv = selectedProyeccionFfvv;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public List<CategoriaClienteBean> getListaCategoriaCliente() {
		return listaCategoriaCliente;
	}

	public void setListaCategoriaCliente(
			List<CategoriaClienteBean> listaCategoriaCliente) {
		this.listaCategoriaCliente = listaCategoriaCliente;
	}

	public List<ZonaBean> getListaZonas() {
		return listaZonas;
	}

	public void setListaZonas(List<ZonaBean> listaZonas) {
		this.listaZonas = listaZonas;
	}

	public int getIdZona() {
		return idZona;
	}

	public void setIdZona(int idZona) {
		this.idZona = idZona;
	}

	public int getIdCanal() {
		return idCanal;
	}

	public void setIdCanal(int idCanal) {
		this.idCanal = idCanal;
	}

	public String getColorProyeccionAsignado() {
		return colorProyeccionAsignado;
	}

	public void setColorProyeccionAsignado(String colorProyeccionAsignado) {
		this.colorProyeccionAsignado = colorProyeccionAsignado;
	}

}
